package com.lmk.dsa.algorithm.sort;

import java.security.SecureRandom;
import com.lmk.dsa.struct.commons.KvNode;

/**
 * 数据工具类
 * @author LaoMake
 * @since 1.0
 */
public class SortTools {

	/** 随机数生成器 */
	private static SecureRandom random = new SecureRandom();

	/**
	 * 生成指定长度的数组，用随机数填充
	 * 
	 * @param length
	 * @return
	 */
	public static KvNode[] generateArray(int length) {
		KvNode<Integer, Object>[] array = new KvNode[length];
		for (int i = 0; i < length; i++) {
			array[i] = generateNode(array);
		}
		return array;
	}

	/**
	 * 为指定的数组，产生一个数字元素，要求不能重复
	 * 
	 * @param array
	 * @return
	 */
	private static KvNode<Integer, Object> generateNode(KvNode[] array) {
		int n = random.nextInt(array.length * 10);
		boolean exist = false;

		for (KvNode<Integer, Object> a : array) {
			if((a != null) && (a.key != null) && (n == a.key.intValue())){
				exist = true;
				break;
			}
		}

		if (exist) {
			return generateNode(array);
		} else {
			KvNode<Integer, Object> node = new KvNode<Integer, Object>(n);
			node.setOnlyKey(true); // 设置只使用Key，如需附带数据，可注释掉这一行
			return node;
		}

	}

	/**
	 * 检查数组是否为已排序
	 *
	 * @param array
	 * @param asc
	 * @return
	 */
	public static boolean isSort(KvNode<Integer, Object>[] array, boolean asc) {
		if (array == null)
			return false;

		boolean ok = true;
		for (int i = 0; i < array.length - 1; i++) {
			if (asc) {
				if (array[i].key.intValue() > array[i + 1].key.intValue()) {
					ok = false;
					break;
				}
			} else {
				if (array[i].key.intValue() < array[i + 1].key.intValue()) {
					ok = false;
					break;
				}
			}
		}

		return ok;
	}

}
